• Dave Chinner's avatar
    xfs: clean up inode lockdep annotations · 0952c818
    Dave Chinner authored
    Lockdep annotations are a maintenance nightmare. Locking has to be
    modified to suit the limitations of the annotations, and we're
    always having to fix the annotations because they are unable to
    express the complexity of locking heirarchies correctly.
    
    So, next up, we've got more issues with lockdep annotations for
    inode locking w.r.t. XFS_LOCK_PARENT:
    
    	- lockdep classes are exclusive and can't be ORed together
    	  to form new classes.
    	- IOLOCK needs multiple PARENT subclasses to express the
    	  changes needed for the readdir locking rework needed to
    	  stop the endless flow of lockdep false positives involving
    	  readdir calling filldir under the ILOCK.
    	- there are only 8 unique lockdep subclasses available,
    	  so we can't create a generic solution.
    
    IOWs we need to treat the 3-bit space available to each lock type
    differently:
    
    	- IOLOCK uses xfs_lock_two_inodes(), so needs:
    		- at least 2 IOLOCK subclasses
    		- at least 2 IOLOCK_PARENT subclasses
    	- MMAPLOCK uses xfs_lock_two_inodes(), so needs:
    		- at least 2 MMAPLOCK subclasses
    	- ILOCK uses xfs_lock_inodes with up to 5 inodes, so needs:
    		- at least 5 ILOCK subclasses
    		- one ILOCK_PARENT subclass
    		- one RTBITMAP subclass
    		- one RTSUM subclass
    
    For the IOLOCK, split the space into two sets of subclasses.
    For the MMAPLOCK, just use half the space for the one subclass to
    match the non-parent lock classes of the IOLOCK.
    For the ILOCK, use 0-4 as the ILOCK subclasses, 5-7 for the
    remaining individual subclasses.
    
    Because they are now all different, modify xfs_lock_inumorder() to
    handle the nested subclasses, and to assert fail if passed an
    invalid subclass. Further, annotate xfs_lock_inodes() to assert fail
    if an invalid combination of lock primitives and inode counts are
    passed that would result in a lockdep subclass annotation overflow.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    0952c818
xfs_inode.h 14.5 KB