getcwd lies on/under nfs4-mounted zfs dataset

Rick Macklem rmacklem at uoguelph.ca
Wed Jan 16 14:33:53 UTC 2013


pluknet at gmail.com wrote:
> Hi.
> 
> We stuck with the problem getting wrong current directory path
> when sitting on/under zfs dataset filesystem mounted over NFSv4.
> Both nfs server and client are 10.0-CURRENT from December or so.
> 
> The component path "user3" unexpectedly appears to be "." (dot).
> nfs-client:/home/user3 # pwd
> /home/.
> nfs-client:/home/user3/var/run # pwd
> /home/./var/run
> 
Although you are welcome to try the patch I emailed you yesterday, I
think it will result in the tree traversal algorithm in libc complaining
about a cycle at some point, because there could be another node in the
file system on the server that has the same fileno as the mounted-on-fileno.

I need to take a close look at getcwd() and see how it handles mount point
crossings.

The trick is that the NFSv4 client must make getcwd() happy, but also try to
avoid duplicate fileno (i-node #s) values within a subtree of the mount
that has a given fsid.

Since I can reproduce it here, I'll work on it and post if/when I have
a better patch.

rick

> nfs-client:~ # procstat -f 3225
> PID COMM FD T V FLAGS REF OFFSET PRO NAME
> 3225 a.out text v r r-------- - - - /home/./var/a.out
> 3225 a.out ctty v c rw------- - - - /dev/pts/2
> 3225 a.out cwd v d r-------- - - - /home/./var
> 3225 a.out root v d r-------- - - - /
> 
> The used setup follows.
> 
> 1. NFS Server with local ZFS:
> # cat /etc/exports
> V4: / -sec=sys
> 
> # zfs list
> pool1 10.4M 122G 580K /pool1
> pool1/user3 on /pool1/user3 (zfs, NFS exported, local, nfsv4acls)
> 
> Exports list on localhost:
> /pool1/user3 109.70.28.0
> /pool1 109.70.28.0
> 
> # zfs get sharenfs pool1/user3
> NAME PROPERTY VALUE SOURCE
> pool1/user3 sharenfs -alldirs -maproot=root -network=109.70.28.0/24
> local
> 
> 2. pool1 is mounted on NFSv4 client:
> nfs-server:/pool1 on /home (nfs, noatime, nfsv4acls)
> 
> So that on NFS client the "pool1/user3" dataset comes at /home/user3.
> / - ufs
> /home - zpool-over-nfsv4
> /home/user3 - zfs dataset "pool1/user3"
> 
> At the same time it works as expected when we're not on zfs dataset,
> but directly on its parent zfs pool (also over NFSv4), e.g.
> nfs-client:/home/non_dataset_dir # pwd
> /home/non_dataset_dir
> 
> The ls command works as expected:
> nfs-client:/# ls -dl /home/user3/var/
> drwxrwxrwt+ 6 root wheel 6 Jan 10 16:19 /home/user3/var/
> 
> --
> wbr,
> pluknet
> _______________________________________________
> freebsd-fs at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-fs
> To unsubscribe, send any mail to "freebsd-fs-unsubscribe at freebsd.org"


More information about the freebsd-fs mailing list