xfs: clean up inode lockdep annotations
authorDave Chinner <dchinner@redhat.com>
Wed, 19 Aug 2015 00:32:49 +0000 (10:32 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 19 Aug 2015 00:32:49 +0000 (10:32 +1000)
commit0952c8183c1575a78dc416b5e168987ff98728bb
treef9a583446e2e31fdb4eb15fb7d14701a8db6cdc0
parent7df1c170b9a45ab3a7401c79bbefa9939bf8eafb
xfs: clean up inode lockdep annotations

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: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h