Well, technically fid 3 isn't 'open', only fid 2 is open - at least according to the protocol. fid 3 and fid 2 are both clones of fid 1. However, thanks for the alternative workaround. If you get a chance, can you check that my change to the client to partially fix this for the other servers doesn't break nfs-ganesha: https://github.com/ericvh/linux/commit/fddc7721d6d19e4e6be4905f37ade5b0521f4ed5 On Mon, Apr 13, 2015 at 3:27 AM, Dominique Martinet < dominique.martinet@cea.fr> wrote: > Hi, > > for what it's worth, the sample code given works with nfs-ganesha > server, so I'm not sure what's not working here. > > Here's the server traces: > TATTACH: tag=1 fid=0 afid=-1 uname='nobody' aname='/export' n_uname=-1 > RATTACH: tag=1 fid=0 qid=(type=128,version=0,path=1) > TGETATTR: tag=1 fid=0 request_mask=0x7ff > RGETATTR: tag=1 valid=0x7ff qid=(type=128,version=0,path=1) mode=040755 > uid=0 gid=0 nlink=3 rdev=192 size=4096 blksize=4096 blocks=8 > atime=(1428909387,0) mtime=(1428909389,0) ctime=(1428909389,0) btime=(0,0) > gen=0, data_version=0 > TATTACH: tag=1 fid=1 afid=-1 uname='' aname='/export' n_uname=0 > RATTACH: tag=1 fid=1 qid=(type=128,version=0,path=1) > TGETATTR: tag=1 fid=1 request_mask=0x3fff > RGETATTR: tag=1 valid=0x7ff qid=(type=128,version=0,path=1) mode=040755 > uid=0 gid=0 nlink=3 rdev=192 size=4096 blksize=4096 blocks=8 > atime=(1428909387,0) mtime=(1428909389,0) ctime=(1428909389,0) btime=(0,0) > gen=0, data_version=0 > TWALK: tag=1 fid=1 newfid=2 nwname=1 (component 1/1 :test.txt) > RERROR(_9P_TWALK) tag=1 err=(2|No such file or directory) > TWALK: tag=1 fid=1 newfid=2 nwname=0 > RWALK: tag=1 fid=1 newfid=2 nwqid=0 fileid=1 pentry=0x8278c0 refcount=4 > TLCREATE: tag=1 fid=2 name=test.txt flags=0100102 mode=0100644 gid=0 > RLCREATE: tag=1 fid=2 name=test.txt > qid=(type=0,version=0,path=144115205255725065) iounit=0 > pentry=0x7fffc0000d00 > TWALK: tag=1 fid=1 newfid=3 nwname=1 (component 1/1 :test.txt) > RWALK: tag=1 fid=1 newfid=3 nwqid=1 fileid=144115205255725065 > pentry=0x7fffc0000d00 refcount=3 > TGETATTR: tag=1 fid=3 request_mask=0x17ff > RGETATTR: tag=1 valid=0x7ff qid=(type=0,version=0,path=144115205255725065) > mode=0100644 uid=0 gid=0 nlink=1 rdev=192 size=0 blksize=4096 blocks=0 > atime=(1428909674,0) mtime=(1428909674,0) ctime=(1428909674,0) btime=(0,0) > gen=0, data_version=0 > TWRITE: tag=1 fid=2 offset=0 count=6 > RWRITE: tag=1 fid=2 offset=0 input count=6 output count=6 > TUNLINKAT: tag=1 dfid=1 name=test.txt > TUNLINKAT: tag=1 dfid=1 name=test.txt > TGETATTR: tag=1 fid=3 request_mask=0x3fff > RGETATTR: tag=1 valid=0x7ff qid=(type=0,version=0,path=144115205255725065) > mode=0100644 uid=0 gid=0 nlink=0 rdev=192 size=6 blksize=4096 blocks=0 > atime=(1428909674,0) mtime=(1428909674,0) ctime=(1428909674,0) btime=(0,0) > gen=0, data_version=0 > TCLUNK: tag=1 fid=2 > RCLUNK: tag=1 fid=2 > TCLUNK: tag=1 fid=3 > RCLUNK: tag=1 fid=3 > > (if you're not familiar with 9P, ATTACH = mount, WALK = create a new > 'fid' either clone of current file (nwname = 0) or lookup, CLUNK ~= > close. Rest is obvious enough) > > > There's no lookup between the unlink and the getattr, so what I think is > missing is that both qemu and diod do not understand that fids 2 and 3 > refer to the same open file ? > It's a bit of a weird behavior that the client will open a new fid > through lookup walk for a first stat, but I'm mounting with cache=none > here so you should be having the same. > > -- > Dominique >