mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-04 04:02:26 +00:00
lockd: don't call vfs_lock_file() for pending requests
This patch returns nlm_lck_blocked in nlmsvc_lock() when an asynchronous lock request is pending. During testing I ran into the case with the side-effects that lockd is waiting for only one lm_grant() callback because it's already part of the nlm_blocked list. If another asynchronous for the same nlm_block is triggered two lm_grant() callbacks will occur but lockd was only waiting for one. To avoid any change of existing users this handling will only being made when export_op_support_safe_async_lock() returns true. Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
2dd10de8e6
commit
b743612c0a
@ -541,6 +541,22 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
|
||||
goto out;
|
||||
}
|
||||
|
||||
spin_lock(&nlm_blocked_lock);
|
||||
/*
|
||||
* If this is a lock request for an already pending
|
||||
* lock request we return nlm_lck_blocked without calling
|
||||
* vfs_lock_file() again. Otherwise we have two pending
|
||||
* requests on the underlaying ->lock() implementation but
|
||||
* only one nlm_block to being granted by lm_grant().
|
||||
*/
|
||||
if (exportfs_lock_op_is_async(inode->i_sb->s_export_op) &&
|
||||
!list_empty(&block->b_list)) {
|
||||
spin_unlock(&nlm_blocked_lock);
|
||||
ret = nlm_lck_blocked;
|
||||
goto out;
|
||||
}
|
||||
spin_unlock(&nlm_blocked_lock);
|
||||
|
||||
if (!wait)
|
||||
lock->fl.fl_flags &= ~FL_SLEEP;
|
||||
mode = lock_to_openmode(&lock->fl);
|
||||
@ -553,13 +569,6 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
|
||||
ret = nlm_granted;
|
||||
goto out;
|
||||
case -EAGAIN:
|
||||
/*
|
||||
* If this is a blocking request for an
|
||||
* already pending lock request then we need
|
||||
* to put it back on lockd's block list
|
||||
*/
|
||||
if (wait)
|
||||
break;
|
||||
ret = async_block ? nlm_lck_blocked : nlm_lck_denied;
|
||||
goto out;
|
||||
case FILE_LOCK_DEFERRED:
|
||||
|
Loading…
Reference in New Issue
Block a user