Skip to content
  • Konstantin Belousov's avatar
    Add a framework that tracks exclusive vnode lock generation count for UFS. · 61846fc4
    Konstantin Belousov authored
    This count is memoized together with the lookup metadata in directory
    inode, and we assert that accesses to lookup metadata are done under
    the same lock generation as they were stored.  Enabled under DIAGNOSTICS.
    
    UFS saves additional data for parent dirent when doing lookup
    (i_offset, i_count, i_endoff), and this data is used later by VOPs
    operating on dirents.  If parent vnode exclusive lock is dropped and
    re-acquired between lookup and the VOP call, we corrupt directories.
    
    Framework asserts that corruption cannot occur that way, by tracking
    vnode lock generation counter.  Updates to inode dirent members also
    save the counter, while users compare current and saved counters
    values.
    
    Also, fix a case in ufs_lookup_ino() where i_offset and i_count could
    be updated under shared lock.  It is not a bug on its own since dvp
    i_offset results from such lookup cannot be used, but it causes false
    positive in the checker.
    
    In collaboration with:	pho
    Reviewed by:	mckusick (previous version), markj
    Tested by:	markj (syzkaller), pho
    Sponsored by:	The FreeBSD Foundation
    Differential revision:	https://reviews.freebsd.org/D26136
    61846fc4