On 10/12/20 6:03 PM, Brian Foster wrote: > On Fri, Oct 09, 2020 at 09:55:12PM +0200, Pavel Reichl wrote: >> Refactor xfs_isilocked() to use newly introduced __xfs_rwsem_islocked(). >> __xfs_rwsem_islocked() is a helper function which encapsulates checking >> state of rw_semaphores hold by inode. >> >> Signed-off-by: Pavel Reichl <preichl@xxxxxxxxxx> >> Suggested-by: Dave Chinner <dchinner@xxxxxxxxxx> >> Suggested-by: Eric Sandeen <sandeen@xxxxxxxxxx> >> Suggested-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> >> Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> >> --- >> fs/xfs/xfs_inode.c | 48 ++++++++++++++++++++++++++++++++++++++-------- >> fs/xfs/xfs_inode.h | 21 +++++++++++++------- >> 2 files changed, 54 insertions(+), 15 deletions(-) >> >> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >> index c06129cffba9..7c1ceb4df4ec 100644 >> --- a/fs/xfs/xfs_inode.c >> +++ b/fs/xfs/xfs_inode.c >> @@ -345,9 +345,43 @@ xfs_ilock_demote( >> } >> >> #if defined(DEBUG) || defined(XFS_WARN) >> -int >> +static inline bool >> +__xfs_rwsem_islocked( >> + struct rw_semaphore *rwsem, >> + int lock_flags) >> +{ >> + int arg; >> + >> + if (!debug_locks) >> + return rwsem_is_locked(rwsem); >> + >> + if (lock_flags & (1 << XFS_SHARED_LOCK_SHIFT)) { >> + /* >> + * The caller could be asking if we have (shared | excl) >> + * access to the lock. Ask lockdep if the rwsem is >> + * locked either for read or write access. >> + * >> + * The caller could also be asking if we have only >> + * shared access to the lock. Holding a rwsem >> + * write-locked implies read access as well, so the >> + * request to lockdep is the same for this case. >> + */ >> + arg = -1; >> + } else { >> + /* >> + * The caller is asking if we have only exclusive access >> + * to the lock. Ask lockdep if the rwsem is locked for >> + * write access. >> + */ >> + arg = 0; >> + } ... > > Also, I find the pattern of shifting in the caller slightly confusing, > particularly with the 'lock_flags' name being passed down through the > caller. Any reason we couldn't pass the shift value as a parameter and > do the shift at the top of the function so the logic is clear and in one > place? > Hi Brian, is following change what you had in mind? Thanks! >> @@ -349,14 +349,16 @@ xfs_ilock_demote( static inline bool __xfs_rwsem_islocked( struct rw_semaphore *rwsem, - int lock_flags) + int lock_flags, + int shift) { int arg; + const int shifted_lock_flags = lock_flags >> shift; if (!debug_locks) return rwsem_is_locked(rwsem); - if (lock_flags & (1 << XFS_SHARED_LOCK_SHIFT)) { + if (shifted_lock_flags & (1 << XFS_SHARED_LOCK_SHIFT)) { /* * The caller could be asking if we have (shared | excl) * access to the lock. Ask lockdep if the rwsem is @@ -387,20 +389,20 @@ xfs_isilocked( { if (lock_flags & (XFS_ILOCK_EXCL | XFS_ILOCK_SHARED)) { ASSERT(!(lock_flags & ~(XFS_ILOCK_EXCL | XFS_ILOCK_SHARED))); - return __xfs_rwsem_islocked(&ip->i_lock, - (lock_flags >> XFS_ILOCK_FLAG_SHIFT)); + return __xfs_rwsem_islocked(&ip->i_lock, lock_flags, + XFS_ILOCK_FLAG_SHIFT); } if (lock_flags & (XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED)) { ASSERT(!(lock_flags & ~(XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED))); - return __xfs_rwsem_islocked(&ip->i_mmaplock, - (lock_flags >> XFS_MMAPLOCK_FLAG_SHIFT)); + return __xfs_rwsem_islocked(&ip->i_mmaplock, lock_flags, + XFS_MMAPLOCK_FLAG_SHIFT); } if (lock_flags & (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED)) { - return __xfs_rwsem_islocked(&VFS_I(ip)->i_rwsem, - (lock_flags >> XFS_IOLOCK_FLAG_SHIFT)); + return __xfs_rwsem_islocked(&VFS_I(ip)->i_rwsem, lock_flags, + XFS_IOLOCK_FLAG_SHIFT); } ASSERT(0);