svn commit: r303763 - in head/sys/cddl: compat/opensolaris/sys contrib/opensolaris/uts/common/fs/zfs contrib/opensolaris/uts/common/fs/zfs/sys

Andriy Gapon avg at FreeBSD.org
Fri Aug 5 07:01:23 UTC 2016


On 05/08/2016 09:23, Andriy Gapon wrote:
>   - replace ZFS_ENTER mechanism with VFS managed / visible mechanism
>   - replace zfs_zget with zfs_vget[f] as much as possible

I'd like to add a couple more words about these items.

At the moment the operation like rollback and (incremental) receive are
protected by z_teardown_lock that is acquired within ZPL and thus after
vnode locks acquired by VFS.

That has several consequences:

- we have to be very careful to not acquire any vnode locks within
ZFS_ENTER + ZFS_EXIT delimited blocks and that leads to more complex code

- as a consequence we can not lock ZFS vnodes right when we get them, so
we have to resort to some tricks

- zfs rollback, as an example, may cause trouble for operations like
zfs_remove, because the parent and child vnodes are looked up (and
locked) before calling zfs_remove and by the time it grabs
z_teardown_lock those vnodes may already point to arbitrary nodes as a
result of the rollback

- there is a LOR between the normal path (e.g. page in or page out)
where the vnode and page locks are acquired before z_teardown_lock and
the rollback path where ZPL calls vn_pages_remove() while holding the
tear-down lock.

So, logically we should acquire a lock that protects a filesystem from a
rollback (or other out-of-band modification) before acquiring any of its
vnode locks.  Currently we have a similar but rather FFS-specific
mechanism of vn_start_write and vfs_write_suspend.  The mechanism is
used for blocking writes when taking FFS snapshots, but it could be
extended to block reads for rollbacks.

-- 
Andriy Gapon


More information about the svn-src-head mailing list