On Thu, 2018-03-15 at 15:13 +0200, Amir Goldstein wrote: > On Thu, Mar 15, 2018 at 11:47 AM, Eddie Horng <eddiehorng.tw@xxxxxxxx > m> wrote: > > I tried to track the difference between overlay-NFSv3 and ext4- > > NFSv3 > > of encode_post_op_attr. > > mount configuration: > > none /share overlay > > rw,relatime,lowerdir=/base/lower,upperdir=/base/upper,workdir=/base > > /work,index=on,nfs_export=on > > 0 0 > > localhost:/share /mnt/n nfs > > rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,prot > > o=tcp,timeo=600,retrans=2,sec=sys,mountaddr=127.0.0.1,mountvers=3,m > > ountport=40931,mountproto=udp,local_lock=none,addr=127.0.0.1 > > 0 0 > > /dev/loop0 /share2 ext4 rw,relatime,data=ordered 0 0 > > localhost:/share2 /mnt/n2 nfs > > rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,prot > > o=tcp,timeo=600,retrans=2,sec=sys,mountaddr=127.0.0.1,mountvers=3,m > > ountport=40931,mountproto=udp,local_lock=none,addr=127.0.0.1 > > 0 0 > > > > file tree: > > /mnt/n > > > -- dirA > > > `-- bar > > > -- dirL > > > `-- ro-file > > > > `-- foo > > > > /mnt/n2 > > `-- lost+found > > > > Attached log are dmesg start from "readdir /mnt/n (n2)" with nfs > > and > > nfsd log are enabled all by sunrpc.nfs(d)_debug. I also add a > > dump_stack() in the beginning of encode_post_op_attr. > > > > It seems overlay and ext4 have different call flow after "nfsd: > > READDIR+", there is no failure in overlay's encode_post_op_attr, > > nfsd > > does fill the attrs, same as ext4 but it has additional readdir > > call > > to child node of "/". I'm not sure if this is normal to overlay and > > is > > the cause of DT_UNKNOWN. > > I tried to follow nfsd readdir code to see where the difference can > come > from, but nothing poped at me so far. > > > > > In additional, overlay returns DT_UNKNOWN to either lower dir or > > merged dir. > > Your test is readdir of a merged dir, the behavior could differ when > readdir of > an overlayfs non merged dir. > > Please send the output and dmesg of readdir of the non-merged lower > dir: > > /readdir/a.out /mnt/n/dirL > > Please mount an NFS share of /base and send the output of the same > dir: > > /readdir/a.out /mnt/n_base/lower/n/dirL > > Right now I speculate that the issue you report is related to > how merged dirs are iterated, but not sure exactly why. fs/nfsd has nothing to do with ${SUBJECT}. If you want to trace where the DT_UNKNOWN is coming from, then you need to look at the _client_ code in fs/nfs/nfs3xdr.c:nfs3_decode_dirent(). -- Trond Myklebust Linux NFS client maintainer, PrimaryData trond.myklebust@xxxxxxxxxxxxxxx ��.n��������+%������w��{.n�����{���w���jg��������ݢj����G�������j:+v���w�m������w�������h�����٥