Commit a85f193e authored by Andy Adamson's avatar Andy Adamson Committed by Trond Myklebust
Browse files

lockd: make nlmsvc_lock use only posix_lock_file



Reorganize nlmsvc_lock() to make full use of posix_lock_file(), which does
eveything nlmsvc_lock() needs - no need to call posix_test_lock(),
posix_locks_deadlock(), or posix_block_lock() separately.

Signed-off-by: default avatarAndy Adamson <andros@citi.umich.edu>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 5de0e502
Loading
Loading
Loading
Loading
+4 −19
Original line number Diff line number Diff line
@@ -297,7 +297,6 @@ u32
nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
			struct nlm_lock *lock, int wait, struct nlm_cookie *cookie)
{
	struct file_lock	*conflock;
	struct nlm_block	*block;
	int			error;
	u32			ret;
@@ -320,14 +319,15 @@ again:
	/* Lock file against concurrent access */
	down(&file->f_sema);

	if (!(conflock = posix_test_lock(file->f_file, &lock->fl))) {
	error = posix_lock_file(file->f_file, &lock->fl);

	dprintk("lockd: posix_lock_file returned %d\n", error);

	if (error != -EAGAIN) {
		if (block)
			nlmsvc_delete_block(block, 0);
		up(&file->f_sema);

		dprintk("lockd: posix_lock_file returned %d\n", -error);
		switch(-error) {
		case 0:
			ret = nlm_granted;
@@ -335,9 +335,6 @@ again:
		case EDEADLK:
			ret = nlm_deadlock;
			goto out;
		case EAGAIN:
			ret = nlm_lck_denied;
			goto out;
		default:			/* includes ENOLCK */
			ret = nlm_lck_denied_nolocks;
			goto out;
@@ -349,11 +346,6 @@ again:
		goto out_unlock;
	}

	if (posix_locks_deadlock(&lock->fl, conflock)) {
		ret = nlm_deadlock;
		goto out_unlock;
	}

	/* If we don't have a block, create and initialize it. Then
	 * retry because we may have slept in kmalloc. */
	/* We have to release f_sema as nlmsvc_create_block may try to
@@ -369,13 +361,6 @@ again:
	/* Append to list of blocked */
	nlmsvc_insert_block(block, NLM_NEVER);

	if (list_empty(&block->b_call.a_args.lock.fl.fl_block)) {
		/* Now add block to block list of the conflicting lock
		   if we haven't done so. */
		dprintk("lockd: blocking on this lock.\n");
		posix_block_lock(conflock, &block->b_call.a_args.lock.fl);
	}

	ret = nlm_lck_blocked;
out_unlock:
	up(&file->f_sema);