Fwd: FreeBSD 13.1 : ZFS NFS : .zfs/snapshot : Stale file handle : with zfs destroy snapshot process in Uninterruptible sleep

From: Michel Le Cocq <lecocq_at_ipgp.fr>
Date: Fri, 16 Sep 2022 09:02:40 UTC
Hi push here this following bug, which si specific FS.

in short, since FreeBSD 13.1 a ZFS exported FS over NFS will hang if a
NFS client tried to acces to a snapshot.

see bellow my post to freebsd-bug.

--
M

Michel Le Cocq <lecocq@ipgp.fr> writes:

> Hi, since upgrading to 13.1-RELEASE of FreeBSD I can't anymore access to
> .zfs/snapshot folder over NFS.
>
> When I tried to acces do .zfs/snapshot over NFS I obtain a 'Stale file
> handle'.
>
> Worse : Then if you tried to delete the snapshot that was accessed, you
> 'zfs destroy snapshot' process will fall in 'Uninterruptible sleep'
> (usually IO). So you can't kill it ! 
>
> I post this bug here :
> https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=266236
>
> A little small procedure to reproduce this bug.
>
> Install a fresh FreeBSD server under 13.1-p2
>
> 	root@server:~# freebsd-version 
> 	13.1-RELEASE-p2
> 	
> Inside a zfs pool create a vol and share it by NFS.
>
> 	root@server:~# zfs get name,mountpoint,sharenfs tank/zfsnfstest
> 	NAME             PROPERTY    VALUE             SOURCE
> 	tank/zfsnfstest  name        tank/zfsnfstest   -
> 	tank/zfsnfstest  mountpoint  /tank/zfsnfstest  local
> 	tank/zfsnfstest  sharenfs    on                local
> 	
> Mount localy your sharenfs vol.
>
> 	root@server:~# mount -t nfs 127.0.0.1:/tank/zfsnfstest /mnt
> 	
> Create a snapshot.
>
> 	root@server:~# zfs snapshot tank/zfsnfstest@1
> 	
> Check you can access localy.
>
> 	root@server:~# ls -l /tank/zfsnfstest/.zfs/snapshot/1/
> 	total 0
> 	root@server:~#
> 	
> Try to acces from mounted NFS vol.
>
> 	root@server:~# ls -l /mnt/.zfs/snapshot/1/
> 	total 0
> 	ls: /mnt/.zfs/snapshot/1/: Stale NFS file handle
> 	
> Here we see we don't have access from NFS.
>
> Try to remove your previous created snapshot.
>
> 	root@server:~# zfs destroy tank/zfsnfstest@1
>
> This process didn't end...
> 		
> 	root@server:~ # ps aux
> 	USER    PID  %CPU %MEM    VSZ  RSS TT  STAT STARTED      TIME COMMAND
> 	[...]
> 	root 58027 0.0 0.0 18012 7256 1 D+ 12:27 0:00.01 zfs destroy
> tank/zfsnfstest@1
> 	
> D mean : Uninterruptible sleep (usually IO). So you can't kill it !
>
> 	root@server:~ # kill 58027
> 	root@server:~ # ps aux | grep 58027
> 	root 58027 0.0 0.0 18012 7256 1 D+ 12:27 0:00.01 zfs destroy
> tank/zfsnfstest@1
> 	root@server:~ # kill -1 58027
> 	root@server:~ # ps aux | grep 58027
> 	root 58027 0.0 0.0 18012 7256 1 D+ 12:27 0:00.01 zfs destroy
> tank/zfsnfstest@1
> 	root@server:~ # kill -9 58027
> 	root@server:~ # ps aux | grep 58027
> 	root 58027 0.0 0.0 18012 7256 1 D+ 12:27 0:00.01 zfs destroy
> tank/zfsnfstest@1
> 	root@server:~ #
>
> Thanks.