Add xfs_is_ilocked(), xfs_is_iolocked() and xfs_is_mmaplocked() Signed-off-by: Pavel Reichl <preichl@xxxxxxxxxx> Suggested-by: Dave Chinner <dchinner@xxxxxxxxxx> --- fs/xfs/xfs_inode.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_inode.h | 3 +++ 2 files changed, 56 insertions(+) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index c5077e6326c7..80874c80df6d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -372,6 +372,59 @@ xfs_isilocked( ASSERT(0); return 0; } + +static inline bool +__xfs_is_ilocked( + struct rw_semaphore *rwsem, + bool shared, + bool excl) +{ + bool locked = false; + + if (!rwsem_is_locked(rwsem)) + return false; + + if (!debug_locks) + return true; + + if (shared) + locked = lockdep_is_held_type(rwsem, 0); + + if (excl) + locked |= lockdep_is_held_type(rwsem, 1); + + return locked; +} + +bool +xfs_is_ilocked( + struct xfs_inode *ip, + int lock_flags) +{ + return __xfs_is_ilocked(&ip->i_lock.mr_lock, + (lock_flags & XFS_ILOCK_SHARED), + (lock_flags & XFS_ILOCK_EXCL)); +} + +bool +xfs_is_mmaplocked( + struct xfs_inode *ip, + int lock_flags) +{ + return __xfs_is_ilocked(&ip->i_mmaplock.mr_lock, + (lock_flags & XFS_MMAPLOCK_SHARED), + (lock_flags & XFS_MMAPLOCK_EXCL)); +} + +bool +xfs_is_iolocked( + struct xfs_inode *ip, + int lock_flags) +{ + return __xfs_is_ilocked(&VFS_I(ip)->i_rwsem, + (lock_flags & XFS_IOLOCK_SHARED), + (lock_flags & XFS_IOLOCK_EXCL)); +} #endif /* diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 492e53992fa9..6ba575f35c1f 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -417,6 +417,9 @@ int xfs_ilock_nowait(xfs_inode_t *, uint); void xfs_iunlock(xfs_inode_t *, uint); void xfs_ilock_demote(xfs_inode_t *, uint); int xfs_isilocked(xfs_inode_t *, uint); +bool xfs_is_ilocked(struct xfs_inode *, int); +bool xfs_is_mmaplocked(struct xfs_inode *, int); +bool xfs_is_iolocked(struct xfs_inode *, int); uint xfs_ilock_data_map_shared(struct xfs_inode *); uint xfs_ilock_attr_map_shared(struct xfs_inode *); -- 2.24.1