<div dir="ltr"><br><div class="gmail_quote"><div dir="ltr">On Thu, Mar 8, 2018 at 10:17 PM Daniel Gryniewicz &lt;<a href="mailto:dang@redhat.com">dang@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 03/07/2018 10:21 PM, Kinglong Mee wrote:<br>
&gt; On 2018/3/7 21:10, Daniel Gryniewicz wrote:<br>
&gt;&gt; On 03/06/2018 10:10 PM, Kinglong Mee wrote:<br>
&gt;&gt;&gt; On 2018/3/7 10:59, Kinglong Mee wrote:<br>
&gt;&gt;&gt;&gt; When using nfsv3 on glusterfs-3.13.1-1.el7.x86_64 and nfs-ganesha-2.6.0-0.2rc3.el7.centos.x86_64,<br>
&gt;&gt;&gt;&gt; I gets strange &quot;Invalid argument&quot; when writing file.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; 1. With quota disabled;<br>
&gt;&gt;&gt;&gt; nfs client mount nfs-ganesha share, and do &#39;ll&#39; in the testing directory.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; 2. Enable quota;<br>
&gt;&gt;&gt;&gt; # getfattr -d -m . -e hex /root/rpmbuild/gvtest/nfs-ganesha/testfile92<br>
&gt;&gt;&gt;&gt; getfattr: Removing leading &#39;/&#39; from absolute path names<br>
&gt;&gt;&gt;&gt; # file: root/rpmbuild/gvtest/nfs-ganesha/testfile92<br>
&gt;&gt;&gt;&gt; trusted.gfid=0xe2edaac0eca8420ebbbcba7e56bbd240<br>
&gt;&gt;&gt;&gt; trusted.gfid2path.b3250af8fa558e66=0x39663134343566662d653530332d343831352d396635312d3236633565366332633137642f7465737466696c653932<br>
&gt;&gt;&gt;&gt; trusted.glusterfs.quota.9f1445ff-e503-4815-9f51-26c5e6c2c17d.contri.3=0x00000000000002000000000000000001<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Notice: testfile92 without trusted.pgfid xattr.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; The trusted.pgfid will be created by the next name lookup; nameless lookup don&#39;t create it.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; 3. restart glusterfs volume by &quot;gluster volume stop/start gvtest&quot;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Restarting glusterfsd here cleanup all inode cache from memory;<br>
&gt;&gt;&gt; after starting, inode of testfile92&#39;s parent is NULL.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; 4. echo somedata &gt; testfile92<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Because, nfs-ganesha and nfs client has cache for testfile92,<br>
&gt;&gt;&gt; before write fops, no name lookup happens that trusted.pgfid is not created for testfile92.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Quota_writev call quota_build_ancestry building the ancestry in quota_check_limit,<br>
&gt;&gt;&gt; but testfile92 doesn&#39;t contain trusted.pgfid, so that write fops failed with Invalid argument.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I have no idea of fixing this problem, any comments are welcome.<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; I think, ideally, Gluster would send an invalidate upcall under the circumstances, causing Ganesha do drop it&#39;s cached entry.<br>
&gt;<br>
&gt; It doesn&#39;t work.<br>
&gt; I try to restarting nfs-ganesha, and echo data to testfile92, the problem also exists.<br>
&gt;<br>
&gt; After nfs-ganesha restart,<br>
&gt; 1. A GETATTR is send from nfs-client for the testfile92, ganesha translates it to nameless lookup.<br>
&gt; 2. A ACCESS gets attributes from nfs-ganesha&#39;s cache (cached by #1).<br>
&gt; 3. A SETATTR sets the testfile92&#39;s size to 0, ganesha translates it to setattr fop.<br>
&gt; 4. A WRITE also get Invalid argument error.<br>
&gt;<br>
&gt; If ganesha drops its cache, nfs client may write file by filehandle;<br>
&gt; ganesha lookup it by nameless lookup from glusterfs,<br>
&gt; so that, trusted.pgfid isn&#39;t created too.<br>
&gt;<br>
&gt; I think, a name lookup is needed for testfile92 after quota enable.<br>
&gt;<br>
&gt; thanks,<br>
&gt; Kinglong Mee<br>
&gt;<br>
<br>
If a name lookup is needed, then gluster cannot provide NFS semantics in<br>
these circumstances.  NFS *requires* that access by handle continue to<br>
work once the client has a handle.  In fact, there&#39;s no way to get a<br>
name for this, since the name doesn&#39;t exist anywhere in the handle (by<br>
design, since a name is an attribute of a dirent, not of a handle/inode).<br>
<br>
So, this likely is a bug in Gluster, and needs to be fixed there.  Would<br>
it be possible to enable quota globally at the start as a workaround?<br></blockquote><div><br></div><div>
<pre>Quota is a function that can be enabled at any time.
If enable quota immediately after creating filesystem (contains only one directory &quot;/&quot;), 
the trusted.pgfid extend-attribute is created automatically when creating file,
this problem is not exit.

thanks,
Kinglong Mee</pre>

 </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Daniel<br>
<br>
<br>
</blockquote></div></div>