Fix Details -----------
Problem report (GH Issue) upstream in ZFS on Linux: https://github.com/zfsonlinux/zfs/issues/4816 ("Looping in zfs_zget()")
With very similar stack trace (syscall -> shrink -> zfs_{inactive/rmnode/purgedir/zget}) https://github.com/zfsonlinux/zfs/issues/4816#issuecomment-229532796
Proposed patch in the Issue (not the right/final solution): https://github.com/zfsonlinux/zfs/issues/4816#issuecomment-229537558 https://github.com/zfsonlinux/zfs/pull/4822 ("Allow zfs_purgedir() to skip inodes undergoing eviction")
However, that proposed patch is not the right/final solution: https://github.com/zfsonlinux/zfs/pull/4822#issuecomment-230938382 https://github.com/zfsonlinux/zfs/pull/4822#issuecomment-232208224
Instead, these proposed patches are actually the right/final solution: https://github.com/zfsonlinux/zfs/pull/4827 ("xattr dir doesn't get purged during iput")
The two patches are merged upstream: https://github.com/zfsonlinux/zfs/pull/4827#issuecomment-232207013
1) ddae16a xattr dir doesn't get purged during ipu 2) 31b6111 Kill zp->z_xattr_parent to prevent pinning
Available in the 0.7.0 release:
$ git describe --contains ddae16a 31b6111 zfs-0.7.0-rc1~102 zfs-0.7.0-rc1~101
Thus Ubuntu only needs these patches on Xenial (zfs-linux < 0.7.0):
$ rmadison zfs-linux zfs-linux | 0.6.5.6-0ubuntu8 | xenial/universe | source zfs-linux | 0.6.5.6-0ubuntu27 | xenial-updates | source zfs-linux | 0.7.5-1ubuntu15 | bionic | source zfs-linux | 0.7.5-1ubuntu16.6 | bionic-updates | source zfs-linux | 0.7.12-1ubuntu5 | disco | source zfs-linux | 0.8.1-1ubuntu8 | eoan | source
There's a later commit that changes/"reverts" the commit ddae16a ("xattr dir doesn't get purged during ipu"), but it's not a bug fix, but rather a refactor/feature.
https://github.com/zfsonlinux/zfs/pull/4838
With commit dfbc86309fd8 (below).
The commit ids are not mentioned in further commits upstream.
$ git log --oneline --grep ddae16a ddae16a^..origin/master dfbc86309fd8 Use native inode->i_nlink instead of znode->z_links
$ git log --oneline --grep 31b6111 ddae16a^..origin/master $
Fix Details
-----------
Problem report (GH Issue) upstream in ZFS on Linux: /github. com/zfsonlinux/ zfs/issues/ 4816 ("Looping in zfs_zget()")
https:/
With very similar stack trace (syscall -> shrink -> zfs_{inactive/ rmnode/ purgedir/ zget}) /github. com/zfsonlinux/ zfs/issues/ 4816#issuecomme nt-229532796
https:/
Proposed patch in the Issue (not the right/final solution): /github. com/zfsonlinux/ zfs/issues/ 4816#issuecomme nt-229537558 /github. com/zfsonlinux/ zfs/pull/ 4822 ("Allow zfs_purgedir() to skip inodes undergoing eviction")
https:/
https:/
However, that proposed patch is not the right/final solution: /github. com/zfsonlinux/ zfs/pull/ 4822#issuecomme nt-230938382 /github. com/zfsonlinux/ zfs/pull/ 4822#issuecomme nt-232208224
https:/
https:/
Instead, these proposed patches are actually the right/final solution: /github. com/zfsonlinux/ zfs/pull/ 4827 ("xattr dir doesn't get purged during iput")
https:/
The two patches are merged upstream: /github. com/zfsonlinux/ zfs/pull/ 4827#issuecomme nt-232207013
https:/
1) ddae16a xattr dir doesn't get purged during ipu
2) 31b6111 Kill zp->z_xattr_parent to prevent pinning
Available in the 0.7.0 release:
$ git describe --contains ddae16a 31b6111
zfs-0.7.0-rc1~102
zfs-0.7.0-rc1~101
Thus Ubuntu only needs these patches on Xenial (zfs-linux < 0.7.0):
$ rmadison zfs-linux
zfs-linux | 0.6.5.6-0ubuntu8 | xenial/universe | source
zfs-linux | 0.6.5.6-0ubuntu27 | xenial-updates | source
zfs-linux | 0.7.5-1ubuntu15 | bionic | source
zfs-linux | 0.7.5-1ubuntu16.6 | bionic-updates | source
zfs-linux | 0.7.12-1ubuntu5 | disco | source
zfs-linux | 0.8.1-1ubuntu8 | eoan | source
There's a later commit that changes/"reverts" the
commit ddae16a ("xattr dir doesn't get purged during ipu"),
but it's not a bug fix, but rather a refactor/feature.
https:/ /github. com/zfsonlinux/ zfs/pull/ 4838
With commit dfbc86309fd8 (below).
The commit ids are not mentioned in further commits upstream.
$ git log --oneline --grep ddae16a ddae16a^ ..origin/ master
dfbc86309fd8 Use native inode->i_nlink instead of znode->z_links
$ git log --oneline --grep 31b6111 ddae16a^ ..origin/ master
$