Re: [PATCH v11 1/4] xfs: Refactor xfs_isilocked()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




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);




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux